package cn.biplam.front.component.data.tree;

import cn.biplam.common.tools.TOOLS;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;


/**
 * 树型控件的基础类<BR>
 * 根据树的VC、DC控件提供的数据返回生成树所需的数据。<BR>
 * 需要的数据:字段名、节点名称、节点级别、节点类型、opertorID<BR>
 *   TreeData数据顺序说明:<BR>
 *      1 nodeID <BR>
		2 parent <BR>
		3 nodeName <BR>
		4 level<BR>
		5 isLeaf<BR>
		6 sequence<BR>
		7 haveBrother<BR>
		8 haveLBrother<BR>
		9 operator<BR>
		10 nodeDesc<BR>
		11 nodeCode<BR>
		12 isRoot<BR>
		13 nodeType<BR>
		13以后 parentsHaveLBrother 从根节点开始<BR>
 * @author WangSong 2009-6-5上午11:06:07
 * @version 1.0
 */
public abstract class TreeData {

	/** 当前访问节点内容 */
	protected String[] node;
	/** 当前树平面结构数据集 */
	protected String[][] rs;
	/** 当前访问节点的次序号 */
	protected int currentNode;
	/** 虚根节点名称 */
	protected String vNodeName;
	/** 虚根节点图片路径 */
	protected String vNodePic;
	/**向下取几级 */
	private int levelDown;
	/** 树编号,新树使用*/
	private String treeIndex;
	/** 表名*/
	private String tableName;

	public TreeData(){
		this.currentNode=-1;
	}

	/**
	 * 返回树是否还有数据
	 * @return 树是否还有数据
	 */
	public boolean haveNext(){
		if(rs==null){
			return false;
		}
		if(currentNode<rs.length-1){
			return true;
		}else{
			return false;
		}
	}

	/**
	 * 移动到下一个节点
	 * @throws ErrorMessage 
	 */
	public void moveNext() throws ErrorMessage{
		node=rs[++currentNode];
	}

	/**
	 * 设置虚拟根节点
	 * @param vNodeName 虚拟根节点名称
	 * @param vNodePic  虚拟根节点图片路径
	 */
	public void setVirtualRootNode(String vNodeName,String vNodePic){
		this.vNodeName=vNodeName;
		this.vNodePic=vNodePic;
	}

	/**
	 *  设置虚根节点是否显示
	 * @param virtualNodeVisialble
	 */
	public abstract void setVirtualNodeVisiable(boolean virtualNodeVisialble);

	/**
	 * 获取当前节点节点ID
	 * @return 当前节点节点ID
	 * @throws ErrorMessage 
	 */
	public String getNodeId() throws ErrorMessage{
		return node[0];
	}

	/**
	 * 获取节点父亲节点
	 * @return
	 * @throws ErrorMessage
	 */
	public String getNodeParent()throws ErrorMessage{
		return node[1];
	}
	
	/**
	 * 获取当前节点名
	 * @return  当前节点名
	 * @throws ErrorMessage 
	 */
	public String getNodeName() throws ErrorMessage{
		return node[2];
	}

	/**
	 * 获取当前节点节点层级
	 * @return 当前节点节点层级
	 * @throws ErrorMessage 
	 */
	public int getNodeLevel() throws ErrorMessage{
		return TOOLS.stringToInt(node[3]);
	}


	/**
	 * 获取当前节点是否是叶子节点
	 * @return 返回当前节点是否是叶子节点
	 * @throws ErrorMessage 
	 */
	public char isLeaf() throws ErrorMessage{
		return node[4].charAt(0);
	}

	/**
	 * 获取当前节点是否有儿子 
	 * @return 返回当前节点是否有儿子 1 有儿子， 0 无儿子
	 * @throws ErrorMessage 
	 */
	public char haveChild() throws ErrorMessage{
		return node[4].charAt(0);
	}

	/**
	 * 获取当前节点是否有哥哥 
	 * @return 当前节点是否有哥哥
	 * @throws ErrorMessage 
	 */
	public char haveBrother() throws ErrorMessage{
		return node[6].charAt(0);
	}

	/**
	 * 获取当前节点是否有弟弟
	 * @return 返回当前节点是否有弟弟
	 * @throws ErrorMessage 
	 */
	public char haveLBrother() throws ErrorMessage{
		return node[7].charAt(0);
	}

	/**
	 * 获取当前节点的附加标示符字段
	 * @return String 当前节点的附加标示符字段
	 * @throws ErrorMessage 
	 */
	public String getOperatorType() throws ErrorMessage{
		return node[8];
	}
	
	/**
	 *  获取树的节点描述
	 * @return 树的节点描述
	 */
	public String getNodeDesc(){
		return node[9];
	}

	/**
	 * 获取当前节点对应真实数据表的物理ID
	 * @return 当前节点对应真实数据表的物理ID
	 */
	public String getNodeRealId(){
		return node[10];
	}

	/**
	 * 获取当前节点是否是根节点
	 * @return 返回当前节点是否是根节点
	 * @throws ErrorMessage
	 */
	public boolean isRoot() throws ErrorMessage{
		if(this.getNodeLevel()==1){
			return true;
		}else{
			return false;
		}
	}

	/**
	 * 获取树的节点大类类型
	 * @return 树的节点大类类型
	 */
	public String getNodeType(){
		return node[12];
	}

	/**
	 * 获取当前节点所有父亲节点是否有弟弟
	 * @return 当前节点所有父亲节点是否有弟弟
	 */
	public char[] getParentSibling(){
		String pslb = "";
		for(int i=13;i<node.length;i++){
			if(node[i]!=null){
				pslb = pslb + node[i];
			}
		}
		return pslb.toCharArray();
	}

	/**
	 * 获取虚拟根节点名称 
	 * @return 虚拟根节点名称 
	 */
	public String getVNodeName() {
		return this.vNodeName;
	}

	/**
	 * 获取虚拟根节点图片路径
	 * @return 虚拟根节点图片路径
	 */
	public String getVNodePic() {
		return this.vNodePic;	
	}

	/**
	 * 取树向下展开几层 
	 * @return
	 */
	public int getLevelDown() {
		return levelDown;
	}

	/**
	 * 设置向下展开几层
	 * @param levelDown
	 */
	public void setLevelDown(int levelDown) {
		this.levelDown = levelDown;
	}

	/**
	 * 获取所有数据
	 * @return
	 */
	public String[][] getData(){
		return rs;
	}

	/**
	 * 取dc的树编号
	 * @return String 树编号
	 */
	public String getTreeIndex() {
		return treeIndex;
	}

	/**
	 * 设置dc的树编号
	 * @param treeIndex 树编号
	 */
	public void setTreeIndex(String treeIndex) {
		this.treeIndex = treeIndex;
	}
	
	public String getTableName() {
		return tableName;
	}

	public void setTableName(String tableName) {
		this.tableName = tableName;
	}

	/**
	 * 生成TreeData数据结构
	 * @throws ErrorMessage
	 */
	public abstract void create() throws ErrorMessage;

	/**
	 * 取得需展开节点的所有父亲id
	 * @param extendNodeId 需要展开的节点Id
	 * @param level        需要展开的节点在树中的级别
	 * @return KvMap<父节点id,父节点id>
	 */
	public abstract KvMap<String,String> getExtendNodeAllParent(String extendNodeId) throws ErrorMessage ;
}
